package com.tianqu.tms.core.util;


import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.log4j.Logger;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * <p>
 * 图片操作，改变大小加水印加文字
 * </p>
 * 
 * Change History:<br />
 * 
 * Seq Date Author Description<br />
 * --- ------------ ----------------- -----------------------------<br />
 * 001 2011/10/24 liu gang init<br />
 */
public class ImageOperate
{
	private static Logger logger = Logger.getLogger(ImageOperate.class);
	
	public final static int PAGE_W = 620;
	public final static int PAGE_H = 465;
	private static String fontValue = "车集网  www.chejiwang.com";
	private static String fontType = "宋体";
	private static int fontStyle = Font.ROMAN_BASELINE + Font.BOLD;
	private static int fontSize = 15;
	private static int pageH = PAGE_H;
	private static int pageW = PAGE_W;

	public String getFontValue()
	{
		return fontValue;
	}

	public void setFontValue(String fontValue)
	{
		this.fontValue = fontValue;
	}

	public String getFontType()
	{
		return fontType;
	}

	public void setFontType(String fontType)
	{
		this.fontType = fontType;
	}

	public int getFontStyle()
	{
		return fontStyle;
	}

	public void setFontStyle(int fontStyle)
	{
		this.fontStyle = fontStyle;
	}

	public int getFontSize()
	{
		return fontSize;
	}

	public void setFontSize(int fontSize)
	{
		this.fontSize = fontSize;
	}

	public int getPageH()
	{
		return pageH;
	}

	public void setPageH(int pageH)
	{
		this.pageH = pageH;
	}

	public int getPageW()
	{
		return pageW;
	}

	public void setPageW(int pageW)
	{
		this.pageW = pageW;
	}

	/**
	 * 对图片进行如下处理： 1. 修改图片大小 2. 給图片追加文字水印
	 */
	public static void formatImg(File srcImgFile, File outImgFile)
	{
		try
		{
			formatImg(srcImgFile, pageW, pageH, outImgFile);
		}
		catch(Exception e)
		{
			// TODO Auto-generated catch block
			logger.error("处理图片文件异常",e);
		}
	}

	/**
	 * 对图片进行如下处理： 1. 修改图片大小 2. 給图片追加文字水印
	 */
	public static void formatImg(File srcImgFile, int imageWidth, int imageHeight, File outImgFile)
	{
		try
		{
			/*
			 * 修改图片大小
			 */
			Image src = ImageIO.read(srcImgFile);
			int srcImgW = src.getWidth(null);
			int srcImgH = src.getHeight(null);
			
			//int new_w =  int new_h
			int outImgW = srcImgW;
			int outImgH = srcImgH;
			
			if(srcImgW > imageWidth || srcImgH > imageHeight)
			{
				float   tmpdouble     =   imageWidth; 
				float   tagSize   =   srcImgW / tmpdouble;   //   缩放比例 
	
				tmpdouble   =   imageHeight; 
				if(tagSize <(srcImgH/tmpdouble))  
				{
					tagSize   =   srcImgH/tmpdouble;   
				}
	
				outImgW   =   Math.round(srcImgW/tagSize); 
				outImgH   =   Math.round(srcImgH/tagSize); 
	
			}
			
			
			BufferedImage tag = new BufferedImage(outImgW, outImgH, BufferedImage.TYPE_INT_RGB);
			// java提供了4个缩放的微调选项。
			// image.SCALE_SMOOTH //平滑优先
			// image.SCALE_FAST//速度优先
			// image.SCALE_AREA_AVERAGING //区域均值
			// image.SCALE_REPLICATE //像素复制型缩放
			// image.SCALE_DEFAULT //默认缩放模式
			Graphics g = tag.getGraphics();
			g.drawImage(src.getScaledInstance(outImgW, outImgH, Image.SCALE_SMOOTH), 0, 0, null);
	
			// /*
			// * 图片追加文字水印
			// */
			// // //源文件
			// int scrImgW = src.getWidth(null);
			// int srcImgH = src.getHeight(null);
			// Graphics g = tag.createGraphics();
			// g.drawImage(src,0,0,scrImgW,srcImgH,null);
	
			/*
			 * 文件右下方加文字
			 */
			// 设置颜色。
//			g.setColor(Color.BLACK);
//			// 最后一个参数用来设置字体的大小
//			Font f1 = new Font(fontType, fontStyle, fontSize);
//			g.setFont(f1);
//			// 10,20 表示这段文字在图片上的位置(x,y) .第一个是你设置的内容。
//			g.drawString(fontValue, outImgW - 240, outImgH - 10);
			/*
			 * 文件左上方加文字
			 */
//			g.setColor(Color.WHITE);
//			// 最后一个参数用来设置字体的大小
//			Font f2 = new Font(fontType, fontStyle, fontSize);
//			g.setFont(f2);
//			// 表示这段文字在图片上的位置(x,y) .第一个是你设置的内容。
//			g.drawString(fontValue, 10, 20);
	
			createImgFile(outImgFile, tag);
		}
		catch(Exception e)
		{
			logger.error("处理图片文件异常",e);
		}
	}

	/**
	 * 给图片加图片水印
	 * 
	 * @param srcImgFile
	 *            源文件
	 * @param wMarkImgFile
	 *            水印文件
	 * @param outImgFile
	 *            处理后文件
	 * @throws IOException
	 */
//	public void addImgWaterMark(File srcImgFile, File wMarkImgFile, File outImgFile) throws Exception
//	{
//		// 源文件
//		Image srcImg = ImageIO.read(srcImgFile);
//		int scrImgW = srcImg.getWidth(null);
//		int srcImgH = srcImg.getHeight(null);
//		BufferedImage bufImage = new BufferedImage(scrImgW, srcImgH, BufferedImage.TYPE_INT_RGB);
//		Graphics g = bufImage.createGraphics();
//		g.drawImage(srcImg, 0, 0, scrImgW, srcImgH, null);
//
//		// 水印文件
//		Image wMarkImg = ImageIO.read(wMarkImgFile);
//		int wMarkImgW = wMarkImg.getWidth(null);
//		int wMarkImgH = wMarkImg.getHeight(null);
//
//		// 水印文件在源文件的右下角
//		g.drawImage(wMarkImg, scrImgW - wMarkImgW, srcImgH - wMarkImgH, wMarkImgW, wMarkImgH, null);
//		g.dispose();
//		createImgFile(outImgFile, bufImage);
//
//	}

	/**
	 * 给图片加文字水印
	 * 
	 * @param srcImgFile
	 * @param fontValue
	 * @param outImgFile
	 * @return
	 */
//	public void addFontWaterMark(File srcImgFile, File outImgFile) throws Exception
//	{
//		addFontWaterMark(srcImgFile, this.getFontValue(), outImgFile);
//	}

	/**
	 * 给图片加文字水印
	 * 
	 * @param srcImgFile
	 * @param fontValue
	 * @param outImgFile
	 * @return
	 */
//	public void addFontWaterMark(File srcImgFile, String fontValue, File outImgFile) throws Exception
//	{
//		// 源文件
//		Image srcImg = ImageIO.read(srcImgFile);
//		int scrImgW = srcImg.getWidth(null);
//		int srcImgH = srcImg.getHeight(null);
//		BufferedImage bufImage = new BufferedImage(scrImgW, srcImgH, BufferedImage.TYPE_INT_RGB);
//		Graphics g = bufImage.createGraphics();
//		g.drawImage(srcImg, 0, 0, scrImgW, srcImgH, null);
//
//		/*
//		 * 文件右下方加文字
//		 */
//		// 设置颜色。
//		g.setColor(Color.BLACK);
//		// 最后一个参数用来设置字体的大小
//		Font f1 = new Font(fontType, fontStyle, fontSize);
//		g.setFont(f1);
//		// 10,20 表示这段文字在图片上的位置(x,y) .第一个是你设置的内容。
//		g.drawString(fontValue, scrImgW - 240, srcImgH - 10);
//		/*
//		 * 文件左上方加文字
//		 */
//		g.setColor(Color.WHITE);
//		// 最后一个参数用来设置字体的大小
//		Font f2 = new Font(fontType, fontStyle, fontSize);
//		g.setFont(f2);
//		// 表示这段文字在图片上的位置(x,y) .第一个是你设置的内容。
//		g.drawString(fontValue, 10, 20);
//		createImgFile(outImgFile, bufImage);
//	}

	/**
	 * 修改图片大小
	 * 
	 * @param srcImgFile
	 * @param outImgFile
	 * @throws Exception
	 */
//	public void alterSize(File srcImgFile, File outImgFile) throws Exception
//	{
//		alterSize(srcImgFile, PAGE_W, PAGE_H, outImgFile);
//	}

	/**
	 * 修改图片大小
	 * 
	 * @param srcImgFile
	 * @param new_w
	 * @param new_h
	 * @param outImgFile
	 * @throws Exception
	 */
//	public void alterSize(File srcImgFile, int new_w, int new_h, File outImgFile) throws Exception
//	{
//		Image src = ImageIO.read(srcImgFile);
//		BufferedImage tag = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
//		// java提供了4个缩放的微调选项。
//		// image.SCALE_SMOOTH //平滑优先
//		// image.SCALE_FAST//速度优先
//		// image.SCALE_AREA_AVERAGING //区域均值
//		// image.SCALE_REPLICATE //像素复制型缩放
//		// image.SCALE_DEFAULT //默认缩放模式
//		tag.getGraphics().drawImage(src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0, null);
//		createImgFile(outImgFile, tag);
//	}

	/**
	 * 生成图片
	 * 
	 * @param outImgFile
	 * @param tag
	 * @throws Exception
	 */
	private static void createImgFile(File outImgFile, BufferedImage tag) throws Exception
	{
		FileOutputStream fos = null;
		try
		{
			fos = new FileOutputStream(outImgFile);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
			encoder.encode(tag); // 近JPEG编码
			fos.close();
			fos = null;

		}
		catch(Exception e)
		{
			if(fos != null)
			{
				try
				{
					fos.close();
				}
				catch(IOException e1)
				{
					throw e1;
				}
				fos = null;
			}
			//throw e;
			logger.error("输出jpg编码图片文件异常",e);
		}
	}

	public static void main(String args[])
	{
		String inFileName = "e:/in.jpg";
		String outFileName = "e:/out.jpg";
		//ImageOperate ope = new ImageOperate();
		File inFile = new File(inFileName);
		File outFile = new File(outFileName);
		ImageOperate.formatImg(inFile, outFile);
	}
}